package com.pocket.demo.leetcode;

import cn.hutool.core.lang.Assert;


/**
 * 搜索插入位置
 *  问题描述：
 *      给定一个排序数组和一个目标值，在数组中找到目标值，并返回其索引。如果目标值不存在于数组中，返回它将会被按顺序插入的位置。
 *      请必须使用时间复杂度为 O(log n) 的算法。
 *
 *  示例：
 *      输入：nums = [1,3,5,6], target = 5
 *      输出：2
 *
 *      输入：nums = [1,3,5,6], target = 2
 *      输出：1
 *
 *      输入：nums = [1,3,5,6], target = 7
 *      输出：4
 *
 *  思路：
 *
 *
 *  题目来源：
 *      https://leetcode.cn/leetbook/read/array-and-string/cxqdh/
 */
public class __Array_Binary_Search {

    public static int searchInsert(int[] nums, int target) {
        if(nums == null || nums.length == 0){
            return 0;
        }

        int left = 0, right = nums.length - 1;
        while(left <= right){
            int mid = left + (right - left) / 2;
            if (target == nums[mid]){
                return mid;
            } else if (target < nums[mid]){
                right = mid - 1;
            } else if  (target > nums[mid]){
                left = mid + 1;
            }
        }
        return left;
    }

    public static void main(String[] args) {
        Assert.isTrue(searchInsert(new int[] {1,3,5,6}, 5) == 2);

        Assert.isTrue(searchInsert(new int[] {1,3,5,6}, 2) == 1);

        Assert.isTrue(searchInsert(new int[] {1,3,5,6}, 7) == 4);
    }

}
